package oj;

import java.util.ArrayDeque;
import java.util.Deque;

public class LC42 {
    //单调栈解法：核心思想找到接下来的元素中第一个比自己大的元素，这种思想就会用到单调栈
    //维护一个从栈底到栈顶的递减栈
    //栈顶元素为top,她下面的元素为left 由单调栈的性质可知height[left]>height[top],所以当
    //height[i]>height[top]时，就可以装雨水
    public int trap(int[] height) {
        Deque<Integer> d=new ArrayDeque<>();
        int ans=0;
        for(int i=0;i<height.length;i++){
            while(!d.isEmpty() && height[d.peek()]<height[i]){
                int top=d.pop();
                if(d.isEmpty()){
                    break;
                }
                int left=d.peek();
                int wei=i-left-1;
                int hei=Math.min(height[left],height[i])-height[top];
                ans+=(wei*hei);
            }
            d.push(i);
        }
        return ans;
    }
}
